﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using sir_mix_csharp.entidades;
using sir_mix_csharp.controladores;
using System.Windows.Forms;
using CookComputing.XmlRpc;
using System.Runtime.Remoting;
using sir_mix_csharp.rpc_xml;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;

namespace sir_mix_csharp.controladores
{
    /// <summary>
    /// Classe responsável por controlar as ações do acionista, e todas as notificações de transações efetuadas vindas do servidor.
    /// </summary>
    public class ControladoraPrincipal
    {
        private Form1 janelaPrincipal;
        private ProxySide proxy;
        private string ip = UtilRPC.ip;
        private int porta = UtilRPC.porta;
        private string handler = UtilRPC.handler;

        /// <summary>
        /// Construtora da classe, que é responsável por criar as ações iniciais do acionista, e as listas com as suas ações e os registros de interesse de compras e de vendas.
        /// </summary>
        public ControladoraPrincipal()
        {
            //Configurações do XML-RPC por parte do servidor
            proxy = XmlRpcProxyGen.Create<ProxySide>();
            proxy.Url = UtilRPC.hostServidor;

            // Criação do XML-RPC por parte do cliente

            IDictionary props = new Hashtable();
            props["name"] = "MyHttpChannel";
            props["port"] = porta;
            System.Console.WriteLine("Criando canal...");
            HttpChannel channel = new HttpChannel(props, null, new XmlRpcServerFormatterSinkProvider());
            //System.Console.WriteLine(channel.);
            System.Console.WriteLine("Registrando canal...");
            ChannelServices.RegisterChannel(channel, false);

            //RemotingConfiguration.Configure("configuracaoXML_RPC.exe.config", false);
            RemotingConfiguration.RegisterWellKnownServiceType(
              typeof(ServicosCliente),
              handler,
              WellKnownObjectMode.Singleton);

            // Cria a janela
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            janelaPrincipal = new Form1(this);
            UtilRPC.janelaPrincipal = janelaPrincipal;

            //Ações iniciais            
            UtilRPC.listaAcoes.Add(new Acao("Empresa1", 10));
            UtilRPC.listaAcoes.Add(new Acao("Empresa2", 20));
            UtilRPC.listaAcoes.Add(new Acao("Empresa3", 30));

            Application.Run(janelaPrincipal);
        }


        /// <summary>
        /// Lista os registros de venda que estão registrados no servidor.
        /// </summary>
        internal void listarVendasServidor()
        {
            janelaPrincipal.inserirLog("Estou buscando as vendas no servidor...");
            string[] interesses = proxy.consultarRegistrosInteresse();
            janelaPrincipal.inserirLog("------------------------------");
            janelaPrincipal.inserirLog("Registros de venda no servidor");
            for (int indiceInteresse = 0; indiceInteresse < interesses.Length; indiceInteresse++)
            {
                janelaPrincipal.inserirLog(interesses[indiceInteresse]);
            }
            janelaPrincipal.inserirLog("");
        }

        /// <summary>
        /// Lista as ações do cliente.
        /// </summary>
        internal void listarAcoes()
        {
            janelaPrincipal.inserirLog("------------------------------");
            janelaPrincipal.inserirLog("Minhas ações");
            foreach (Acao acao in UtilRPC.listaAcoes)
            {

                string mensagem = String.Format(" - {0} ações da empresa {1}", acao.getQuantidade().ToString(), acao.getEmpresa());
                janelaPrincipal.inserirLog(mensagem);
            }
            janelaPrincipal.inserirLog("");
        }

        /// <summary>
        /// Método utilizado para inserir um novo registro de venda.
        /// </summary>
        /// <param name="venda">registro de venda a ser inserido.</param>
        internal void registrarInteresseVenda(RegistroInteresse venda)
        {
            UtilRPC.vendas.Add(venda);
            proxy.registrarInteresseVenda(venda.getAcao().getEmpresa(), venda.getAcao().getQuantidade(), venda.getPrazo(), venda.getPreco(), venda.getTempoInicial().ToString(), obterMeuCaminho());
        }

        /// <summary>
        /// Método utilizado para inserir um novo registro de compra.
        /// </summary>
        /// <param name="compra">registro de compra a ser inserido.</param>
        internal void registrarInteresseCompra(RegistroInteresse compra)
        {
            UtilRPC.compras.Add(compra);
            proxy.registrarInteresseCompra(compra.getAcao().getEmpresa(), compra.getAcao().getQuantidade(), compra.getPrazo(), compra.getPreco(), compra.getTempoInicial().ToString(), obterMeuCaminho());
        }

        private string obterMeuCaminho()
        {
            return "http://" + ip + ":" + porta + "/" + handler;
        }

    }

}
